package com.zrf.base.knowledge.util;

import java.util.Arrays;
import java.util.List;

/**
 * 日期工具类
 * @author zhouruifeng
 *         create at 2017/2/27.
 */
public final class DateUtils {
    /**
     * 闰年每月的天数
     */
    private static final List<Integer> LEEP_YEAR_MONTH_DAYS = Arrays.asList(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    /**
     * 非闰年每月的天数
     */
    private static final List<Integer> NOT_LEEP_YEAR_MONTH_DAYS = Arrays.asList(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);

    /**
     * 工具类不被实例化
     */
    private DateUtils(){

    }

    /**
     * 根据参数的年月日得到当天是该年中的第几天
     * @param year 年
     * @param month 月
     * @param day 日
     * @return 该年中的第几天
     */
    public static int dayOfYear(int year, int month, int day){
        List<Integer> monthDays = getMonthDays(year);
        if (month > 12 && month < 1){
            throw new IllegalArgumentException("参数异常，月份只能是1-12之间");
        }
        Integer maxDays = monthDays.get(month - 1);
        if (day > maxDays){
            throw new IllegalArgumentException("参数异常，该月份的最大天数为" + maxDays);
        }
        int days = dayOfYear(year, month);
        days = days - 1 + day;
        return days;
    }

    /**
     * 根据参数的年份和月份获取该月份第一天是一年中的第几天
     * @param year 年份
     * @param month 月份
     * @return 一年中的第几天
     */
    public static int dayOfYear(int year, int month){
        if (month > 12){
            throw new IllegalArgumentException("参数异常，月份只能是1-12之间");
        }

        List<Integer> monthDays = getMonthDays(year);

        int days = 1;
        for (int i = 1; i < month; i++) {
            days += monthDays.get(i-1);
        }
        return days;
    }

    /**
     * 根据年份得到该年份每月的天数
     * @param year 年份
     * @return 每月的天数
     */
    private static List<Integer> getMonthDays(int year) {
        List<Integer> monthDays = null;
        boolean leepYear = isLeepYear(year);
        if (leepYear){
            monthDays = LEEP_YEAR_MONTH_DAYS;
        }else {
            monthDays = NOT_LEEP_YEAR_MONTH_DAYS;
        }
        return monthDays;
    }

    /**
     * 判断某一年是否是闰年
     * 如果不能整除100，判断是否能整除4，否则的话整除以一百
     * @param year 年份
     * @return 是否是闰年
     */
    public static boolean isLeepYear(int year){
        return (year % 100 != 0 && year % 4 == 0) || (year % 400 == 0);
    }

}
